home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Languages / MacQForth 1.0 / asm6502 / documentation / Assembly and QForth < prev    next >
Text File  |  1995-03-20  |  5KB  |  166 lines

  1.  
  2.  
  3. Assembly and QForth
  4. -------------------
  5.  
  6.    
  7.    All of the traps provided as extensions to QForth can be used from 
  8.    assembly language as well.  However, several of them insist that their 
  9.    parameters be on the QForth stack at call time and several return 
  10.    their results to the QForth stack.  This little file details how to 
  11.    use the QForth stack from within an assembly language program.
  12.    
  13.    
  14. ================================================================================
  15.  
  16.  
  17.    1.  QForth stack structure and important locations
  18.    2.  Traps which use the QForth stack
  19.    3.  Programming examples
  20.    
  21.    
  22.    
  23.    
  24. The QForth Stack
  25. ----------------
  26.  
  27.    QForth maintains a one page stack of 16-bit numbers from $AA00-$AAFF, 
  28.    starting at $AAFF and growing downward.  The current stack pointer, 
  29.    which points to the location for the next item pushed on the stack, is 
  30.    in $EE.  The current stack depth is stored in location $F4.  Of interest 
  31.    to assembly language programmers are the two QForth subroutines PUSHDATA 
  32.    and POPDATA which can be used to push and pop values from the QForth data 
  33.    stack:
  34.    
  35.         
  36.         Name      Location       Registers used
  37.         -------------------------------------------------
  38.         PUSHDATA   $20B2       Y (low), X (high) -> stack, A altered
  39.         POPDATA    $20CA       stack -> Y (low), X (high), A altered
  40.         
  41.    Other useful QForth words are:
  42.    
  43.         DUP        $3519       ( n -- n n )
  44.         DROP       $3531       ( n -- )  ( really the same as POPDATA )
  45.         SWAP       $353B       ( n m -- m n )
  46.         OVER       $355E       ( n m -- n m n )
  47.         ROT        $3583       ( i j k -- j k i )
  48.  
  49.    Note: these subroutines alter A, X, and Y.
  50.    
  51.    
  52.         
  53. Traps that use the QForth stack
  54. -------------------------------
  55.  
  56.    The following traps use the QForth stack for passing data:
  57.    
  58.    
  59.    Name     Trap location         Use
  60.    ------------------------------------------------------------------
  61.    Color     $FFC0   ( n -- )     Expects new drawing color on stack
  62.    LineTo    $FFB0   ( x y -- )   Line from current pen to x,y on stack
  63.    MoveTo    $FFA0   ( x y -- )   Set pen to x,y on stack
  64.    Plot      $FFD0   ( x y -- )   Plot a point at x,y
  65.    
  66.    Mouse     $FFE0   ( -- x y b ) Puts mouse position x,y on stack with
  67.                                   button status= 0 (up), FFFF (-1) (down)
  68.   
  69.    CH        $3A9A   ( n -- )     New horizontal position on stack
  70.    CV        $3A8C   ( n -- )     New vertical position on stack
  71.    
  72.    Random2   $FF92   ( n -- n' )  N on stack, returns n' = 0..n-1 on stack
  73.    
  74.    
  75.    Where ( before -- after ) is the usual Forth convention for indicating 
  76.    stack values before and after calling a word.
  77.    
  78.    
  79.    
  80. Programming Examples
  81. --------------------
  82.  
  83.    The following examples are also in the DEMO folder as DEMO1.S, 
  84.    DEMO2.S, and DEMO3.S.  Assemble them with the command line:
  85.    
  86.                   asm6502 -o :demo:demo1.s
  87.    
  88.    , etc.
  89.    
  90.  
  91.  
  92.    1. Plotting a line
  93.    
  94.         
  95.         PUSH = $20B2   ; QForth stack equates
  96.         POP  = $20CA   
  97.         MOVETO = $FFA0 ; MoveTo
  98.         LINETO = $FFB0 ; LineTo
  99.         
  100.          *= $0300      ; start here
  101.          
  102.          ldy #$0a      ; plot from 10,10 to 200,200
  103.          ldx #$00
  104.          jsr PUSH
  105.          ldy #$0a
  106.          ldx #$00
  107.          jsr PUSH      ; push two 10s on the stack  ( x y -- )
  108.          jsr MOVETO    ; set drawing pen
  109.          ldy #$c8
  110.          ldx #$00
  111.          jsr PUSH
  112.          ldy #$c8
  113.          ldx #$00
  114.          jsr PUSH      ; push two 200s on the stack ( x y -- )
  115.          jsr LINETO    ; draw the line
  116.          rts
  117.         
  118.    
  119.         
  120.    2. Waiting for the mouse button to be pressed
  121.    
  122.    
  123.         DROP = $3531   ; could use POPDATA here as well
  124.         MOUSE = $FFE0
  125.         BUTTON = $3FF  ; hold low part of button status
  126.          *= $0300
  127.          
  128.         LOOP jsr MOUSE ; get the mouse
  129.          jsr DROP      ; DROP = POPDATA, so data is in Y (lo) and X (hi)
  130.          sty BUTTON    ; save low byte of button status
  131.          jsr DROP      ; remove mouse location data
  132.          jsr DROP
  133.          lda BUTTON
  134.          cmp #$FF      ; is it FF, low part of FFFF = -1, button down?
  135.          bne LOOP      ; no. keep waiting
  136.          rts           ; yes. all done
  137.          
  138.          
  139.          
  140.    3. Print 20 random numbers from 0..100
  141.    
  142.         
  143.         PUSH = $20B2   ; QForth stack equates
  144.         POP  = $20CA   
  145.         RND2 = $FF92   ; random number off stack
  146.         HOUT = $FDDA   ; output A as a hex number
  147.         COUT = $FDED   ; output A as a character
  148.         COUNT = $3FF   ; count in here
  149.  
  150.          *= $0300
  151.          
  152.          lda #$14      ; setup count
  153.          sta COUNT
  154.         LOOP ldy #$64  ; 100 in Y and X
  155.          ldx #$00
  156.          jsr PUSH      ; ( 100 -- )
  157.          jsr RND2      ; ( -- 0..100 )
  158.          jsr POP       ; in Y and X
  159.          tya           ; n' -> A
  160.          jsr HOUT      ; print it
  161.          lda #$0D      ; carriage return
  162.          jsr COUT
  163.          dec COUNT     ; count <- count - 1
  164.          bne LOOP      ; not done
  165.          rts           ; done
  166.